/*
 * Copyright 2013 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.wo.android.pockybill;

import android.app.Activity;
import android.app.AlarmManager;
import android.app.Fragment;
import android.app.FragmentManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.res.Configuration;
import android.os.Bundle;
import android.support.v4.app.ActionBarDrawerToggle;
import android.support.v4.view.GravityCompat;
import android.support.v4.widget.DrawerLayout;
import android.util.Log;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;

import com.wo.android.pockybill.ui.NotifyComponet;
import com.wo.android.pockybill.ui.NotifyComponetImpl;
import com.wow.wa.bill.serivce.BillService;
import com.wow.wa.bill.serivce.BillServiceImpl;
import com.wow.wa.bill.serivce.CollectDateCompent;
import com.wow.wa.bill.serivce.CollectDateCompentImpl;
import com.wow.wa.bill.serivce.MainService;
import com.wow.wa.bill.serivce.MainServiceImpl;
import com.wow.wa.bill.serivce.vo.DateRange;
import com.wow.wa.bill.serivce.vo.MainDTO;
import com.wow.wa.bill.util.Args;
import com.wow.wa.ui.DialogFactory;

/**
 * This example illustrates a common usage of the DrawerLayout widget in the
 * Android support library.
 * <p/>
 * <p>
 * When a navigation (left) drawer is present, the host activity should detect
 * presses of the action bar's Up affordance as a signal to open and close the
 * navigation drawer. The ActionBarDrawerToggle facilitates this behavior. Items
 * within the drawer should fall into one of two categories:
 * </p>
 * <p/>
 * <ul>
 * <li><strong>View switches</strong>. A view switch follows the same basic
 * policies as list or tab navigation in that a view switch does not create
 * navigation history. This pattern should only be used at the root activity of
 * a task, leaving some form of Up navigation active for activities further down
 * the navigation hierarchy.</li>
 * <li><strong>Selective Up</strong>. The drawer allows the user to choose an
 * alternate parent for Up navigation. This allows a user to jump across an
 * app's navigation hierarchy at will. The application should treat this as it
 * treats Up navigation from a different task, replacing the current task stack
 * using TaskStackBuilder or similar. This is the only form of navigation drawer
 * that should be used outside of the root activity of a task.</li>
 * </ul>
 * <p/>
 * <p>
 * Right side drawers should be used for actions, not navigation. This follows
 * the pattern established by the Action Bar that navigation should be to the
 * left and actions to the right. An action should be an operation performed on
 * the current contents of the window, for example enabling or disabling a data
 * overlay on top of the current content.
 * </p>
 */
public class MainActivity extends Activity {
	private static final String TAG = MainActivity.class.getSimpleName();
	private static final int ADD_CARD_CODE = 0x0002;
	private DrawerLayout mDrawerLayout;
	private ListView mDrawerList;
	private ActionBarDrawerToggle mDrawerToggle;

	private BillService service;
	private MainService mainService;

	private NotifyComponet notifyComponet;
	private MainDTO dto = new MainDTO();

	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) {
		Log.v(TAG, "onActivityResult requestCode=" + requestCode);

		switch (resultCode) {
		case Args.Common.ADD_BILL_CODE:

		case Args.Common.ADD_CARD_EDIT_CODE:
			upDataCardList();
			break;
		}

		if (requestCode == Args.Common.EDIT_CARD_CODE) {

			dto.setCategorys(service.getStringPayTyp(this));

			final ListAdapter listAdapter = new ArrayAdapter<String>(this,
					R.layout.drawer_list_item, dto.getCategorys());
			mDrawerList.setAdapter(listAdapter);
		}

		super.onActivityResult(requestCode, resultCode, data);
	}

	private void upDataCardList() {
		dto.setCategorys(service.getStringPayTyp(this));

		this.dto.setCards(service.getCard(this));

		// Log.v(TAG, "payTypes=" + payTypes);
		this.updateSilderListView();
	}

	public void updateSilderListView() {
		this.runOnUiThread(new Runnable() {

			@Override
			public void run() {
				final ListAdapter listAdapter = new ArrayAdapter<String>(
						MainActivity.this, R.layout.drawer_list_item, dto
								.getCategorys());
				mDrawerList.setAdapter(listAdapter);

			}
		});
	}

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		this.dto = new MainDTO();

		this.service = new BillServiceImpl(this);
		this.mainService = new MainServiceImpl();

		this.mainService.insertNotiyRecord(dto, this);

		// 已經註冊
		if (dto.isReg()) {
			// 已經註冊就不用再註冊了
		}
		// 尚未註冊
		else {
			this.notifyComponet = new NotifyComponetImpl(this);
			this.notifyComponet.eachDayNotiy();
		}

		dto.setmTitle(getTitle());
		dto.setmDrawerTitle(this.getTitle());

		dto.setCategorys(service.getStringPayTyp(this));

		this.dto.setCards(service.getCard(this));

		mDrawerLayout = (DrawerLayout) findViewById(R.id.drawer_layout);
		mDrawerList = (ListView) findViewById(R.id.left_drawer);

		// set a custom shadow that overlays the main content when the drawer
		// opens
		mDrawerLayout.setDrawerShadow(R.drawable.drawer_shadow,
				GravityCompat.START);
		// set up the drawer's list view with items and click listener

		final ListAdapter listAdapter = new ArrayAdapter<String>(this,
				R.layout.drawer_list_item, dto.getCategorys());
		mDrawerList.setAdapter(listAdapter);
		mDrawerList.setOnItemClickListener(new DrawerItemClickListener());

		// enable ActionBar app icon to behave as action to toggle nav drawer
		getActionBar().setDisplayHomeAsUpEnabled(true);
		getActionBar().setHomeButtonEnabled(true);

		// ActionBarDrawerToggle ties together the the proper interactions
		// between the sliding drawer and the action bar app icon
		mDrawerToggle = new ActionBarDrawerToggle(this, /* host Activity */
		mDrawerLayout, /* DrawerLayout object */
		R.drawable.ic_drawer, /* nav drawer image to replace 'Up' caret */
		R.string.drawer_open, /* "open drawer" description for accessibility */
		R.string.drawer_close /* "close drawer" description for accessibility */
		) {
			public void onDrawerClosed(View view) {

				getActionBar().setTitle(dto.getmTitle());
				invalidateOptionsMenu(); // creates call to
											// onPrepareOptionsMenu()
			}

			public void onDrawerOpened(View drawerView) {
				getActionBar().setTitle(dto.getmDrawerTitle());
				invalidateOptionsMenu(); // creates call to
											// onPrepareOptionsMenu()
			}
		};
		mDrawerLayout.setDrawerListener(mDrawerToggle);

		if (savedInstanceState == null) {
			selectItem(0);
		}
	}

	@Override
	protected void onRestart() {
		super.onRestart();
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		MenuInflater inflater = getMenuInflater();
		inflater.inflate(R.menu.main, menu);
		return super.onCreateOptionsMenu(menu);
	}

	/* Called whenever we call invalidateOptionsMenu() */
	@Override
	public boolean onPrepareOptionsMenu(Menu menu) {
		// If the nav drawer is open, hide action items related to the content
		// view
		boolean drawerOpen = mDrawerLayout.isDrawerOpen(mDrawerList);
		// menu.findItem(R.id.action_websearch).setVisible(!drawerOpen);
		menu.findItem(R.id.action_add).setVisible(!drawerOpen);
		menu.findItem(R.id.action_show_payed).setVisible(!drawerOpen);

		menu.findItem(R.id.action_add_card).setVisible(drawerOpen);
		return super.onPrepareOptionsMenu(menu);
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// The action bar home/up action should open or close the drawer.
		// ActionBarDrawerToggle will take care of this.
		if (mDrawerToggle.onOptionsItemSelected(item)) {
			return true;
		}

		switch (item.getItemId()) {

		case R.id.action_add:

			return false;

		case R.id.action_add_card:
			Intent adcIntent = new Intent(this, AddCardActivity.class);
			this.getActionBar().setTitle(item.getTitle());
			this.startActivityForResult(adcIntent, ADD_CARD_CODE);
			return false;

		case R.id.action_delete:

			DialogFactory.getWarm(this.getString(R.string.deleteThePayeDLabel),
					this).show();

			return false;

		case R.id.action_setting:
			// Intent setIt = new Intent(this, SettingActivity.class);
			//
			// this.startActivityForResult(setIt,
			// Args.Common.MOVE_SETTING_CODE);

			CollectDateCompent collectData = new CollectDateCompentImpl(this);
			collectData.readData();

			return false;

		case R.id.action_card_edit:
			final Intent itEd = new Intent(this, EditCardActivty.class);
			startActivityForResult(itEd, Args.Common.EDIT_CARD_CODE);
			return false;

		case R.id.action_stop_reciver:

			AlarmManager am = (AlarmManager) this
					.getSystemService(Context.ALARM_SERVICE);

			Intent it = new Intent(this, BillReceiver.class);

			it.setAction(NotifyComponet.DAY_TYPE);
			final PendingIntent pt = PendingIntent.getBroadcast(this,
					NotifyComponet.REQUESTCODE, it,
					PendingIntent.FLAG_UPDATE_CURRENT);
			am.cancel(pt);

			return false;
		case R.id.action_start_reciver:
			this.notifyComponet.eachDayNotiy();

			return false;

		case R.id.action_find_all_no_payed_bill:
			final Intent itTO = new Intent(this, BillDuteActivity.class);
			startActivityForResult(itTO, Args.Common.EDIT_CARD_CODE);
			return false;

		case R.id.aciont_statistics:
			final Intent statisticsIntent = new Intent(this,
					StatisticsActivity.class);
			this.startActivityForResult(statisticsIntent,
					Args.Common.STAT_CARD_CODE);
			return false;

		case R.id.aciont_settinh:
			final Intent settingInetn = new Intent(this, SettingsActivity.class);
			this.startActivityForResult(settingInetn, Args.Common.SETTING_CODE);
			return false;

		default:
			return true;
		}

	}

	/* The click listner for ListView in the navigation drawer */
	private class DrawerItemClickListener implements
			ListView.OnItemClickListener {
		@Override
		public void onItemClick(AdapterView<?> parent, View view, int position,
				long id) {
			selectItem(position);
		}
	}

	private void selectItem(int position) {
		// update the main content by replacing fragments
		Fragment fragment = new BillListViewFragment();

		final Bundle args = new Bundle();

		final DateRange range = this.service.getRangDay(this.dto.getCards()
				.get(position), this);

		args.putSerializable(Args.Common.CARD, this.dto.getCards()
				.get(position));
		args.putString(Args.Common.START, range.getBegin());
		args.putString(Args.Common.END, range.getEnd());
		args.putString(Args.Common.PAY_TYPE, this.dto.getCards().get(position)
				.get_id().toString());

		fragment.setArguments(args);

		FragmentManager fragmentManager = getFragmentManager();
		fragmentManager.beginTransaction()
				.replace(R.id.content_frame, fragment).commit();

		// update selected item and title, then close the drawer
		mDrawerList.setItemChecked(position, true);
		setTitle(dto.getCategorys().get(position));
		mDrawerLayout.closeDrawer(mDrawerList);
	}

	@Override
	public void setTitle(CharSequence title) {
		dto.setmTitle(title);
		getActionBar().setTitle(dto.getmTitle());
	}

	/**
	 * When using the ActionBarDrawerToggle, you must call it during
	 * onPostCreate() and onConfigurationChanged()...
	 */

	@Override
	protected void onPostCreate(Bundle savedInstanceState) {
		super.onPostCreate(savedInstanceState);
		// Sync the toggle state after onRestoreInstanceState has occurred.
		mDrawerToggle.syncState();
	}

	@Override
	public void onConfigurationChanged(Configuration newConfig) {
		super.onConfigurationChanged(newConfig);
		// Pass any configuration change to the drawer toggls
		mDrawerToggle.onConfigurationChanged(newConfig);
	}

}